/**
 * Copyright 2015 ABSir's Studio
 * 
 * All right reserved
 *
 * Create on 2015年10月5日 上午10:51:46
 */
package com.absir.appserv.system.asset;

import java.io.IOException;

import com.absir.appserv.system.bean.JPayTrade;
import com.absir.appserv.system.bean.value.JePayStatus;
import com.absir.appserv.system.helper.HelperJson;
import com.absir.appserv.system.service.BeanService;
import com.absir.appserv.system.service.VivoService;
import com.absir.appserv.system.service.utils.PayUtils;
import com.absir.appserv.vivo.VivoSignUtils;
import com.absir.core.kernel.KernelString;
import com.absir.server.exception.ServerException;
import com.absir.server.exception.ServerStatus;
import com.absir.server.in.Input;
import com.absir.server.value.Binder;
import com.absir.server.value.Body;
import com.absir.server.value.Server;
import com.fasterxml.jackson.core.JsonProcessingException;

/**
 * @author absir
 *
 */
@Server
public class Asset_vivo extends AssetServer {

	/**
	 * @author absir
	 *
	 */
	public static class PayCallbackData {

		// 响应码 200
		public int respCode;

		// 响应信息 交易完成
		public String respMsg;

		// 签名方法 对关键信息进行签名的算法名称：MD5
		public String signMethod;

		// 签名信息 对关键信息签名后得到的字符串，用于商户验签签名规则请参考签名计算说明
		public String signature;

		// 交易种类 目前固定01
		public int tradeType;

		// 交易状态 0000，代表支付成功
		public String tradeStatus;

		// Cp-id 定长20位数字，由vivo分发的唯一识别码
		public String cpId;

		// appId 应用ID
		public String appId;

		// uid 用户在vivo这边的唯一标识
		public String uid;

		// 商户自定义的订单号 商户自定义，最长 64 位字母、数字和下划线组成
		public String cpOrderNumber;

		// 交易流水号 vivo订单号
		public String orderNumber;

		// 交易金额 单位：分，币种：人民币，为长整型，如：101，10000
		public int orderAmount;

		// 商户透传参数 64位
		public String extInfo;

		// 交易时间 yyyyMMddHHmmss
		public String payTime;
	}

	/**
	 * @param data
	 * @param input
	 * @return
	 * @throws JsonProcessingException
	 * @throws IOException
	 */
	@Body
	public String notify(@Binder PayCallbackData data, Input input) throws JsonProcessingException, IOException {
		if (!KernelString.isEmpty(data.signature)) {
			if (VivoSignUtils.verifySignature(HelperJson.buildParams(input.getParamMap()),
					VivoService.VIVO_CONFIGURE.getMerchantKey())) {
				JPayTrade payTrade = BeanService.ME.get(JPayTrade.class, data.cpOrderNumber);
				if (payTrade != null) {
					payTrade.setPlatform(VivoService.PLAT_FORM_NAME);
					payTrade.setStatus(data.tradeStatus.equals("0000") && data.orderAmount / 100f >= payTrade.getAmount() ? JePayStatus.PAYED
							: JePayStatus.ERROR);
					payTrade.setStatusData(data.tradeStatus);
					if (payTrade.getStatus() == JePayStatus.PAYED) {
						PayUtils.proccessDone(payTrade);

					} else {
						BeanService.ME.merge(payTrade);
					}
				}

				return "success";
			}
		}

		throw new ServerException(ServerStatus.NO_VERIFY);
	}

}
